package com.zzy.task;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

//@Component
public class TaskCommont {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    // 序列化的 数据
    private RedisTemplate redisTemplate;

    //@Scheduled(cron = "0 0 5 * * ?")
    public void doTask(){
        String lockKey = "testscheduledtasklock1";

        try {// 此方法适合 定时任务分布式执行，不是适合高并发
            //  spring-boot-starter-data-redis 需要设置 2.1 以及以上版本
           // Boolean getLock = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
            Boolean getLock = redisTemplate.opsForValue().setIfAbsent(lockKey, "1");
            if (Boolean.TRUE.equals(getLock)) {//这里只是考虑了同时执行，没有考虑，时间有间隔的，会出现重复执行的情况
                redisTemplate.expire(lockKey,30, TimeUnit.SECONDS);//拿到锁之后设置 30 s 过期
                // 任务执行逻辑
                System.out.println("抢到了锁----11111111");
                // 防止时间不一致导致重复执行定时任务。确保只执行一次
                String key = "testscheduledtasklock2";
                String  flag =  stringRedisTemplate.opsForValue().get(key);
                SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd");
                String dateStr1 = sdf2.format(new Date());
                if(flag!=null && !"".equals(flag) && flag.equals(dateStr1)){//今天已经执行
                    System.out.println("没有抢到定时任务");
                }else{
                    System.out.println("抢到了定时任务");
                    stringRedisTemplate.opsForValue().set(key,dateStr1, 60*30 , TimeUnit.SECONDS);
                }
            }else{
                System.out.println("没有抢了锁----22222");
            }
        } finally {
            redisTemplate.delete(lockKey);//释放锁
        }


    }

    @Resource
    private RedissonClient redissonClient;

    public void test(){//分布式锁，时间30秒 到期自动续期
        RLock lock = redissonClient.getLock("myLock");
        try{
            lock.lock();



            String key = "testscheduledtasklock2";
            String  flag =  stringRedisTemplate.opsForValue().get(key);
            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd");
            String dateStr1 = sdf2.format(new Date());
            if(flag!=null && !"".equals(flag) && flag.equals(dateStr1)){//今天已经执行
                System.out.println("今天已经执行");
            }else{
                System.out.println("今天未执行");
                stringRedisTemplate.opsForValue().set(key,dateStr1, 60*30 , TimeUnit.SECONDS);
            }



        }catch (Exception e){
            lock.unlock();
        }

    }
}
